前言
按照損失函數的負梯度成比例地對系數(W 和 b)進行更新。根據訓練樣本的大小,有三種梯度下降的變體:
- Vanilla 梯度下降:在 Vanilla 梯度下降(也稱作批梯度下降)中,在每個循環中計算整個訓練集的損失函數的梯度。該方法可能很慢並且難以處理非常大的數據集。該方法能保證收斂到凸損失函數的全局最小值,但對於非凸損失函數可能會穩定在局部極小值處。
- 隨機梯度下降:在隨機梯度下降中,一次提供一個訓練樣本用於更新權重和偏置,從而使損失函數的梯度減小,然後再轉向下一個訓練樣本。整個過程重覆了若幹個循環。由於每次更新一次,所以它比 Vanilla 快,但由於頻繁更新,所以損失函數值的方差會比較大。
- 小批量梯度下降:該方法結合了前兩者的優點,利用一批訓練樣本來更新參數。
優化器(optimizer)的作用
通過前面的介紹,我們可知人工神經網絡是由很多神經元組成的,每個神經元都有自己的權重w,表示在某項任務中,該神經元的重要程度。假設輸入數據為x,那麽預測值即為:
prediction = wx + b # b 是偏置量
訓練的過程,其實就是計算合適的w和b的過程。那麽,什麽樣的w和b是“合適”的呢?答案就是預測值與真實值相差不大。例如定義損失函數:
loss = sum(|(y_ - prediction)|)
即,真實值減去預測值,取絕對值後求和。訓練的過程,可以粗略的理解成:調節 w 和 b, 使 loss 盡可能小。對w和b參數的調節,就是優化器(optimizer)需要做的,這就是優化器的作用。
上面這種 loss 的定義只是一種比較簡單的例子,當然有其他定義方式。例如cross_entropy(交叉熵),它是用來描述兩種分布的接近程度的,越接近,交叉熵越小。
tensorflow 有哪些優化器(optimizer)
Tensorflow 官方提供了 7 種優化器:
- GradientDescentOptimizer
- AdagradOptimizer
- AdagradDAOptimizer
- MomentumOptimizer
- AdamOptimizer
- FtrlOptimizer
- RMSPropOptimize
優化器的目的都是為了訓練網絡的,這 7 種優化器在對資源的需求上,和訓練速度上有些差異,因此需要根據實際情況選用。下圖是幾種優化器的訓練速度對比,能夠看出差異:在這次應用中, SGD 雖然路徑最短,但是速度卻很慢,其他幾種高階優化器,速度快很多。
下面介紹幾個常用的優化器的構造函數,構造函數告訴我們如何構建這些優化器。
- GradientDescentOptimizer
這個就是最基礎的基於梯度下降法的優化器了。GradientDescentOptimizer 需要用到全部的樣本,速度比較慢,但是叠代到一定次數最終能夠找到最優解,GDO 有個別名 SGD?。建立時,構造函數為:
tf.train.GradientDescentOptimizer.__init__(learning_rate,
use_locking=False, name='GrandientDescent')
# learning_rate:學習率
# use_locking:用鎖
# name:名字
- MomentumOptimizer
MomentumOptimizer 利用了上一次的調整量,因為它考慮了過去的值的影響,有點像物理學中的小球運動會受到之前動量的影響,所以被稱為Momentum(動量)優化器。如果上一次梯度顯示是正方向,這次也是正方向,那麽這次的調整量將加上一定的幅度。如果上次和這次的梯度方向相反,則削減變動幅度,使之更加平穩和快速的往最小點移動。MomentumOptimizer 的構造函數如下:
tf.train.MomentumOptimizer.__init__(learning_rate, momentum,
use_locking=False, name='Momentum', use_nesterov=False)
# momentum: 動量,可以是一個張量,也可以是一個浮點數值
- AdamOptimizer
AdamOptimizer 結合了 MomentumOptimizer 和 RMSPropOptimize,利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。它對學習率有個約束,使得每一次學習率都有個確定範圍,因此參數比較平穩。構造函數如下:
tf.train.AdamOptimizer.__init__(learning_rate=0.001, beta1=0.9,
beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
# beta1, beta2:對第一和第二動量估計的指數衰減率,可以是張量,也可是是浮點數值。
# epsilon:非常小的常量。